package com.shop.controller;

import com.shop.service.*;
import com.shop.util.MyUtil;
import com.shop.util.ResponseUtil;
import com.shop.vo.CategorySellAmts;
import com.shop.vo.CategorySellVo;
import com.shop.vo.DayStatis;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @ClassName HomePageController
 * @Author xiao宋
 * @Date 20:50  2022/10/13
 * @Version 1.0
 * @Description TODO
 */
@Slf4j
@RestController
@RequestMapping("/admin/dashboard")
public class HomePageController {
    @Autowired
    DtsUserService userService;
    @Autowired
    DtsGoodsService goodsService;
    @Autowired
    DtsGoodsProductService goodsProductService;
    @Autowired
    DtsOrderService orderService;
    @Autowired
    StatService statService;

    /**
     *   实现了首页的几个 echarts图
     * @return
     */
    @RequestMapping("/chart")
    public Object chart() {

/**
 *      获取统计数据    -->     饼图
 */
        List<CategorySellAmts> cat = statService.findCategorySell();
        String[] categoryNames = new String[cat.size()];
        for (int i = 0; i < cat.size(); i++) {
            categoryNames[i] = cat.get(i).getName();
        }
//        初步封装数据  --> 饼状图对应数据
        CategorySellVo cs = new CategorySellVo();
        cs.setCategoryNames(categoryNames);
        cs.setCategorySellData(cat);


/**
 *      获取 日期和对应的订单总额等数据   -->  柱状图
 */

//      一个月之内的订单活跃和对应的订单总额，订单笔数
        List<DayStatis>orderDayStstis=statService.findOrderDayStatis();
//        给日期数组 排序
        List<String>dayData=MyUtil.fetchDaySty(orderDayStstis);
//        提取 订单的总额
        List<BigDecimal>orderAmtData=MyUtil.fetchAmtData(orderDayStstis,dayData);
//        提取订单的数量
        List<Integer>orderCnData=MyUtil.fetchCntData(orderDayStstis,dayData);
//        初步封装数据
        Map<String,Object>orderAmts=new HashMap<>();
        orderAmts.put("dayData",dayData);
        orderAmts.put("orderAmtData",orderAmtData);
        orderAmts.put("orderCnData",orderCnData);

/**
 *          用户订单和用户活跃数量   -->   折线图
 */
        List<DayStatis>userDayStatis=statService.findUserDayStatis();
//        用户一个月之内活跃日期
        List<String>userDayData= MyUtil.fetchDaySty(userDayStatis);
//        合并一个月之内的用户活跃日期和上面的一个月之内的订单日期
        userDayData=MyUtil.unionDayDate(dayData,userDayData);

//        获取用户的数量
        List<Integer>userCnt=MyUtil.fetchCntData(userDayStatis,userDayData);
//        获取订单的数量
        List<Integer>orderCnt=MyUtil.fetchCntData(orderDayStstis,userDayData);
//        封装用户和订单数量  --> 折线图
        Map<String, Object> userOrderCnt = new HashMap<>();
        userOrderCnt.put("dayData",userDayData);
        userOrderCnt.put("userCnt",userCnt);
        userOrderCnt.put("orderCnt",orderCnt);

/**
 *       最后一步，再封装一次上面的结果集并返回
 */

        Map<String, Object> data = new HashMap<>();
        data.put("categorySell", cs);//饼图
        data.put("orderAmts",orderAmts);
        data.put("userOrderCnt",userOrderCnt);

        return ResponseUtil.ok(data);

    }

    /**
     * 登录进去首页中间那段
     *
     * @return 前端需要的四个数据分别是
     *
     * <p>"userTotal"               用户数量
     * <p>"goodsTotal"              商品数量
     * <p>"productTotal"            货品数量
     * <p>"orderTotal"              订单数
     */
    @RequestMapping("")
    public Object info() {
        long userTotal = userService.getTotal();
        long goodsTotal = goodsService.getTotal();
        long productTotal = goodsProductService.getTotal();
        long orderTotal = orderService.getTotal();

//        封装结果集并返回数据
        Map<String,Object>data=new HashMap<>();
        data.put("userTotal", userTotal);
        data.put("goodsTotal",goodsTotal );
        data.put("productTotal", productTotal);
        data.put("orderTotal", orderTotal);
        return ResponseUtil.ok(data);
    }


}
